package com.itheima.spring.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @author ：sean
 * @date ：Created in 2020/7/4
 * @description ：
 * @version: 1.0
 */
//@Component
//@Aspect
public class ServiceAop {
		/**
		 * 这就是切点信息 表示对哪些方法感兴趣*/
		@Pointcut("execution(* com.itheima.spring.service.impl.*.* (..))")
		public void pt1(){
		}
		@Before("pt1()")
		public void beforePrintLog(){
			System.out.println("@Before在方法之前执行");
		}
		@AfterReturning("pt1()")
		public void afterReturnPrintLog(){
			System.out.println("@AfterReturning，有异常就不执行");
		}
		@AfterThrowing("pt1()")
		public void afterThrowingPrintLog(){
			System.out.println("@AfterThrowing在方法抛出异常之后执行");
		}
		@After("pt1()")
		public void afterPrintLog(){
			System.out.println("@After 在方法最后执行，不管有没有异常都执行");
		}
		//@Around("pt1()")
		public Object aroundPrintLog(ProceedingJoinPoint joinPoint){
			Object obj = null;
			try {
				System.out.println("在方法之前执行");
				obj = joinPoint.proceed();//调用方法，这相当于调用被代理类的被增强的方法。有点类似，method.invoked()

				System.out.println("在方法之后执行，有异常就不执行");
			} catch (Throwable throwable) {
				throwable.printStackTrace();

				System.out.println("在方法抛出异常之后执行");
			} finally {
				System.out.println("在方法最后执行，不管有没有异常都执行");
			}
			return obj;
		}
}

